package br.com.controller.aula;

import java.io.IOException;
import java.util.Date;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import br.com.arquitetura.controlador.AbstractMBean;
import br.com.arquitetura.excecoes.BDException;
import br.com.arquitetura.servico.ServiceCadastro;
import br.com.data.hibernate.AlunoHibernateDAO;
import br.com.data.hibernate.AulaHibernateDAO;
import br.com.data.hibernate.DiarioHibernateDAO;
import br.com.model.entidade.Aluno;
import br.com.model.entidade.Aula;
import br.com.model.entidade.Diario;


@ManagedBean
@ViewScoped
public class MBGerenciarDiario extends AbstractMBean<Diario>{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private AlunoHibernateDAO alunoHibernateDAO;
	private AulaHibernateDAO aulaHibernateDAO;
	private DiarioHibernateDAO diarioHibernateDAO;
	private List<Diario> diarios;
	private Date dataDiario;
	private boolean cadastravel;
	private boolean editavel;
	private  Aula aula;
	private List<Diario> diarioAula;
	
	
	@ManagedProperty(value="#{serviceCadastro}")
	private ServiceCadastro serviceCadastro;
	
	public void setServiceCadastro(ServiceCadastro serviceCadastro) {
		this.serviceCadastro = serviceCadastro;
	}
	
	public MBGerenciarDiario() throws BDException, IOException {
		
		HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
		Long idAula = (Long) session.getAttribute("idAulaVizualizacao");
		
		if(idAula == null){
			FacesContext.getCurrentInstance().getExternalContext().redirect("/educacao/pages/professor/index.jsf");
		}else{
		
		//Iniciando as variaveis
		diarioHibernateDAO = (DiarioHibernateDAO) getBean("diarioHibernateDAO");
		alunoHibernateDAO = (AlunoHibernateDAO) getBean("alunoHibernateDAO");
		aulaHibernateDAO = (AulaHibernateDAO) getBean("aulaHibernateDAO");
		cadastravel = false;
		editavel = false;
		
		//Iniciando a lista de diarios
		limpar();
		
		}
	}
	
	
	public void irEditar(){
		Calendar data = Calendar.getInstance();
		data.setTime(dataDiario);
		
		diarios = diarioHibernateDAO.buscarDia(aula, data);
		editavel = true;
		if((diarios == null) || (diarios.size() == 0)){
			addFacesInformationMessage("Não foram inseridas faltas para este dia");
			editavel = false;
		}
		
		
	}
	
	public void virificarData() throws BDException{
		Calendar data = Calendar.getInstance();
		data.setTime(dataDiario);
		System.out.println("entrei no verificar");
		if(diarioHibernateDAO.getByField(Diario.class,"dia", data).size() > 0){
			//botar a mensagem q jah foi cadastrado
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Cadastro já realizado", "Você já cadastros as faltas para esta data"));
		}else{
			
			cadastravel = true;
			
		}
	}
	
	public void editar(){
		
		try {
			for (Diario diario : diarios) {
				
				serviceCadastro.atualizar(diario);
				
			}
			
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Sucesso", "Operação realizada"));
			limpar();
		} catch (BDException e) {
			// TODO: handle exception
		}
		
	}
	
	public void cadatrar(){
		
		try {
			Calendar data = Calendar.getInstance();
			
			for (Diario diario : diarios) {
				data.setTime(dataDiario);
				diario.setDia(data);
				serviceCadastro.salvar(diario);
				
			}
			
			FacesContext.getCurrentInstance().addMessage(null,new FacesMessage("Sucesso", "Operação realizada"));
			limpar();
		} catch (BDException e) {
			// TODO: handle exception
		}
		
	}
	
	public void limpar() throws BDException{
		//Recuperando o id da aula
		HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
		Long idAula = (Long) session.getAttribute("idAulaVizualizacao");
		
		cadastravel = false;
		Diario diarioAux;
		this.aula = aulaHibernateDAO.getById(Aula.class, idAula);
		diarios = new ArrayList<Diario>();
		diarioAula = diarioHibernateDAO.getByField(Diario.class, "aula", aula);
		for (Aluno alunos : aula.getTurma().getAlunos()) {
			diarioAux = new Diario();
			diarioAux.setAluno(alunos);
			diarioAux.setAula(aula);
			diarios.add(diarioAux);
		}
		
	}
	

	public List<Diario> getDiarios() {
		return diarios;
	}

	public void setDiarios(List<Diario> diarios) {
		this.diarios = diarios;
	}


	public Date getDataDiario() {
		return dataDiario;
	}


	public void setDataDiario(Date dataDiario) {
		this.dataDiario = dataDiario;
	}


	public boolean isCadastravel() {
		return cadastravel;
	}


	public void setCadastravel(boolean cadastravel) {
		this.cadastravel = cadastravel;
	}

	public Aula getAula() {
		return aula;
	}

	public void setAula(Aula aula) {
		this.aula = aula;
	}

	public boolean isEditavel() {
		return editavel;
	}

	public void setEditavel(boolean editavel) {
		this.editavel = editavel;
	}

	public List<Diario> getDiarioAula() {
		return diarioAula;
	}

	public void setDiarioAula(List<Diario> diarioAula) {
		this.diarioAula = diarioAula;
	}
	
	
	
	
	
	
}
